package com.nl.controller.web.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class GZipUtil {
	
	 public static String gzip(String primStr) {
		  if (primStr == null || primStr.length() == 0) {
			  return primStr;
		  }
		  ByteArrayOutputStream out = new ByteArrayOutputStream();
		   
		  GZIPOutputStream gzip = null;
		  try {
			   gzip = new GZIPOutputStream(out);
			   gzip.write(primStr.getBytes());
		  } catch (IOException e) {
			   e.printStackTrace();
		  } finally {
			   if (gzip != null) {
				    try {
				    	gzip.close();
				    } catch (IOException e) {
				    	e.printStackTrace();
				    }
			   }
		  }
		  return  new sun.misc.BASE64Encoder().encode(out.toByteArray());
	 }
	 /**
	  *
	  * <p>
	  * Description:使用gzip进行解压缩
	  * 先对压缩数据进行BASE64解码。再进行Gzip解压
	  * </p>
	  * 
	  * @param compressedStr 压缩字符串
	  * @return 返回解压字符串
	  */
	 public static String gunzip(String compressedStr) {
		  if (compressedStr == null) {
			  return null;
		  }
		  ByteArrayOutputStream out = new ByteArrayOutputStream();
		  ByteArrayInputStream in = null;
		  GZIPInputStream ginzip = null;
		  byte[] compressed = null;
		  String decompressed = null;
		  try {
			   compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
			   in = new ByteArrayInputStream(compressed);
			   ginzip = new GZIPInputStream(in);
			   byte[] buffer = new byte[1024];
			   int offset = -1;
			   while ((offset = ginzip.read(buffer)) != -1) {
			    out.write(buffer, 0, offset);
			   }
			   decompressed = out.toString();
		  } catch (IOException e) {
			  e.printStackTrace();
		  } finally {
			  try{
				  if (ginzip != null) {
				     ginzip.close();
				   }
				   if (in != null) {
				     in.close();
				   }
				   if (out != null) {
				     out.close();
				   }
			  } catch (Exception e) {
				  e.printStackTrace();
			  }
		  }
		  return decompressed;
	 }
	 /**
	  * 使用zip进行压缩
	  * 
	  * @param str
	  *            压缩前的文本
	  * @return 返回压缩后的文本
	  */
	 public static final String zip(String str) {
		  if (str == null) {
			  return null;
		  }
		  byte[] compressed;
		  ByteArrayOutputStream out = null;
		  ZipOutputStream zout = null;
		  String compressedStr = null;
		  try {
			   out = new ByteArrayOutputStream();
			   zout = new ZipOutputStream(out);
			   zout.putNextEntry(new ZipEntry("0"));
			   zout.write(str.getBytes());
			   zout.closeEntry();
			   compressed = out.toByteArray();
			   compressedStr = new sun.misc.BASE64Encoder().encodeBuffer(compressed);
		  } catch (IOException e) {
			   compressed = null;
		  } finally {
			  try{
				  if (zout != null) {
				     zout.close();
				   }
				   if (out != null) {
				     out.close();
				   }
			  } catch (Exception e) {
				  e.printStackTrace();
			  }
		  }
		  return compressedStr;
	 }
	 /**
	  * 使用zip进行解压缩
	  * 
	  * @param compressed
	  *            压缩后的文本
	  * @return 解压后的字符串
	  */
	 public static final String unzip(String compressedStr) {
		  if (compressedStr == null) {
			  return null;
		  }
		  ByteArrayOutputStream out = null;
		  ByteArrayInputStream in = null;
		  ZipInputStream zin = null;
		  String decompressed = null;
		  try {
			   byte[] compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
			   out = new ByteArrayOutputStream();
			   in = new ByteArrayInputStream(compressed);
			   zin = new ZipInputStream(in);
			   zin.getNextEntry();
			   byte[] buffer = new byte[1024];
			   int offset = -1;
			   while ((offset = zin.read(buffer)) != -1) {
			         out.write(buffer, 0, offset);
			   }
			   decompressed = out.toString();
		  } catch (IOException e) {
			  decompressed = null;
		  } finally {
			  try{
				  if (zin != null) {
					  zin.close();
				   }
				   if (in != null) {
				     in.close();
				   }
				   if (out != null) {
				     out.close();
				   }
			  } catch (Exception e) {
				  e.printStackTrace();
			  }
		  }
		  return decompressed;
	 }
	 
}
